const webpack = require('webpack')
const webpackMerge = require("webpack-merge");
const baseWebpackConfig = require("./webpack.base.config")
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { CleanWebpackPlugin } = require("clean-webpack-plugin")
const UglifyJsPlugin = require("uglifyjs-webpack-plugin")
const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin")
const TerserPlugin = require('terser-webpack-plugin');
const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');
const { resolve, yxScripts } = require("./utils")
const path = require("path")



var webpackProdConfig = webpackMerge.merge(baseWebpackConfig, {
    mode: "production",
    // entry: path.join(__dirname, "../src/index.js"), //入口文件
    entry: { app: yxScripts.findPath("../src/index.js") }, //入口文件
    output: {   // 出口
        path: path.join(__dirname, "../dist"),
        filename: "[name].vendors.js", //输出文件
        // filename: "[hash].[name].vendors.js",
        publicPath: "./", // 打包后的资源的访问路径前缀
    },

    plugins: [
        //html页面插件
        new HtmlWebpackPlugin({
            filename: path.join(__dirname, '../dist/index.html'), //在dist目录中生成index.html
            template: path.join(__dirname, '../src/index.html'),     //源文件
            // filename: utils.resolve('../dist/index.html'), //在dist目录中生成index.html
            inject: 'body', // script标签位于HTML文件的body底部 head | body
            hash: true, // 在打包的资源插入html会加上hash
            title: 'HtmlWebpackPlugin',
            favicon: 'src/assets/favicon.ico',
            chunks: ['app'],
            hasg: 'true',
            date: new Date(),
            minify: {
                removeComments: true,               //去注释
                collapseWhitespace: true,           //压缩空格
                removeAttributeQuotes: true         //去除属性标签的引号  例如 <p id="test" /> 输出 <p id=test/>
            }
        }),
        new CleanWebpackPlugin(),
        // 自定义js优化配置，将会覆盖默认配置
        new UglifyJsPlugin({
            parallel: true,  //使用多进程并行运行来提高构建速度
            sourceMap: false,
            uglifyOptions: {
                warnings: false,
                compress: {
                    unused: true,
                    drop_debugger: true,
                    drop_console: true,
                },
                output: {
                    comments: false // 去掉注释
                }
            }
        }),
        new HardSourceWebpackPlugin(),  //通过缓存提升二次打包速度
    ],
    optimization: {
        minimize: true,
        minimizer: [ // 压缩css
            new OptimizeCSSAssetsPlugin({
                cssProcessorOptions: {
                    discardComments: { removeAll: true } // 移除注释
                }
            }),
            new TerserPlugin({
                //代码压缩插件
                parallel: 5, //开启并行压缩
                cache: true,
            }),
        ],
        splitChunks: {
            // async 表示只从异步加载得模块（动态加载import()）里面进行拆分
            // initial 表示只从入口模块进行拆分
            // all 表示以上两者都包括
            chunks: "async",
            minSize: 30000,   // 大于30k会被webpack进行拆包
            minChunks: 1,     // 被引用次数大于等于这个次数进行拆分
            // import()文件本身算一个
            // 只计算js，不算css
            // 如果同时有两个模块满足cacheGroup的规则要进行拆分，但是maxInitialRequests的值只能允许再拆分一个模块，那尺寸更大的模块会被拆分出来
            maxAsyncRequests: 5,  // 最大的按需加载（异步）请求次数
            // 最大的初始化加载请求次数,为了对请求数做限制，不至于拆分出来过多模块
            // 入口文件算一个
            // 如果这个模块有异步加载的不算
            // 只算js，不算css
            // 通过runtimeChunk拆分出来的runtime不算在内
            // 如果同时又两个模块满足cacheGroup的规则要进行拆分，但是maxInitialRequests的值只能允许再拆分一个模块，那尺寸更大的模块会被拆分出来
            maxInitialRequests: 3,
            automaticNameDelimiter: '~', // 打包分隔符
            name: true,
            cacheGroups: {
                // 默认的配置
                vendors: {
                    test: /[\\/]node_modules[\\/]/,
                    priority: -10
                },
                // 默认的配置，vendors规则不命中的话，就会命中这里
                default: {
                    minChunks: 2, // 引用超过两次的模块 -> default
                    priority: -20,
                    reuseExistingChunk: true
                },
                antdui: {
                    priority: 2,
                    test: /[\\/]node_modules[\\/](antd)[\\/]/,  //(module) => (/antd/.test(module.context)),
                },
                // 拆分基础插件
                basic: {
                    priority: 3,
                    test: /[\\/]node_modules[\\/](moment|react|react-dom|react-router|react-router-dom|mobx|mobx-react|axios)[\\/]/,
                }
            },
        }
    }
})

if (yxScripts.isAnalyz()) {
    webpackProdConfig.plugins.push(new BundleAnalyzerPlugin({
        analyzerMode: 'server',
        analyzerHost: '127.0.0.1',
        analyzerPort: 8889,
        reportFilename: 'report.html',
        defaultSizes: 'parsed',
        openAnalyzer: true,
        generateStatsFile: false,
        statsFilename: 'stats.json',
        statsOptions: null,
        logLevel: 'info'
    }))
}
// if (yxScripts.isDll()) {
//     webpackProdConfig.plugins.push(new webpack.DllReferencePlugin({
//         manifest: require('../build/library/library.json'),
//     }))
// }


const SpeedMeasurePlugin = require('speed-measure-webpack-plugin'); //引入插件
const smp = new SpeedMeasurePlugin(); //创建插件对象


module.exports = smp.wrap(webpackProdConfig)